﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LanusMarket.Support;
using LanusMarket.Models;
using System.Web.Script.Serialization;

namespace LanusMarket.Controllers
{ 
    public class UbicacionController : Controller
    {
        private LanusMarketContext db = new LanusMarketContext();

        public UbicacionController()
        {
            ViewBag.Entity = "Ubicacion";
        }

        //
        // GET: /Ubicacion/
        [Authorize(Roles = "admin,root")]
        public ViewResult Index()
        {
            ViewBag.Action = "Listado de";
            ViewBag.Entity = "Ubicaciones";
            this.SetTitle();
            
            var ubicaciones = db.Ubicaciones.Include(u => u.Localidad);
            return View(ubicaciones.ToList());            
        }

        //
        // GET: /Ubicacion/Details/5
        [Authorize(Roles = "admin,root")]
        public ViewResult Details(int id)
        {
            ViewBag.Action = "Detalle de";            
            this.SetTitle();
            Ubicacion ubicacion = db.Ubicaciones.Find(id);
            return View(ubicacion);
        }

        //
        // GET: /Ubicacion/Create
        [Authorize(Roles = "admin,root")]
        public ActionResult Create()
        {
            ViewBag.Action = "Alta de";
            this.SetTitle();
            ViewBag.LocalidadID = new SelectList(new List<Localidad>(), "LocalidadID", "Nombre");
            ViewBag.ProvinciaID = new SelectList(new List<Provincia>(), "ProvinciaID", "Nombre");
            ViewBag.PaisID = new SelectList(db.Paises, "PaisID", "Nombre");
            ViewBag.SearchKeysID = new MultiSelectList(db.SearchKeys, "SearchKeyID", "Valor");
            return View();
        } 

        //
        // POST: /Ubicacion/Create
        [Authorize(Roles = "admin,root")]
        [HttpPost]
        public ActionResult Create(Ubicacion ubicacion)
        {
            ViewBag.Action = "Alta de";
            this.SetTitle();
            if (ModelState.IsValid)
            {
                Localidad localidad = db.Localidades.Find(ubicacion.LocalidadID);                
                
                ubicacion.ProvinciaID = localidad.ProvinciaID;
                ubicacion.Provincia = localidad.Provincia.Nombre;
                
                ubicacion.PaisID = localidad.Provincia.PaisID;
                ubicacion.Pais = localidad.Provincia.Pais.Nombre;

                ubicacion.SearchKeys = new List<SearchKey>();
                
                var keys = from s in db.SearchKeys
                           where ubicacion.SearchKeysID.Contains(s.SearchKeyID)
                           select s;

                foreach (SearchKey key in keys)
                {
                    ubicacion.SearchKeys.Add(key);
                }               

                db.Ubicaciones.Add(ubicacion);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            ViewBag.LocalidadID = new SelectList(db.Localidades, "LocalidadID", "Nombre", ubicacion.LocalidadID);
            ViewBag.ProvinciaID = new SelectList(db.Provincias, "ProvinciaID", "Nombre", ubicacion.ProvinciaID);
            ViewBag.PaisID = new SelectList(db.Paises, "PaisID", "Nombre", ubicacion.PaisID);
            ViewBag.SearchKeysID = new MultiSelectList(db.SearchKeys, "SearchKeyID", "Valor", ubicacion.SearchKeysID);

            return View(ubicacion);
        }
        
        //
        // GET: /Ubicacion/Edit/5
        [Authorize(Roles = "admin,root")]
        public ActionResult Edit(int id)
        {
            ViewBag.Action = "Editar";
            this.SetTitle();
            Ubicacion ubicacion = db.Ubicaciones.Find(id);
            ViewBag.LocalidadID = new SelectList(db.Localidades, "LocalidadID", "Nombre", ubicacion.LocalidadID);
            ViewBag.ProvinciaID = new SelectList(db.Provincias, "ProvinciaID", "Nombre", ubicacion.ProvinciaID);
            ViewBag.PaisID = new SelectList(db.Paises, "PaisID", "Nombre", ubicacion.PaisID);

            ViewBag.SearchKeysID = new MultiSelectList(db.SearchKeys, "SearchKeyID", "Valor", from k in ubicacion.SearchKeys select k.SearchKeyID);            
            return View(ubicacion);
        }

        //
        // POST: /Ubicacion/Edit/5
        [Authorize(Roles = "admin,root")]
        [HttpPost]
        public ActionResult Edit(Ubicacion ubicacion)
        {
            ViewBag.Action = "Editar";
            this.SetTitle();
            if (ModelState.IsValid)
            {
                Localidad localidad = db.Localidades.Find(ubicacion.LocalidadID);                                
                ubicacion.ProvinciaID = localidad.ProvinciaID;
                ubicacion.Provincia = localidad.Provincia.Nombre;
                ubicacion.PaisID = localidad.Provincia.PaisID;
                ubicacion.Pais = localidad.Provincia.Pais.Nombre;
                
                var ubicacionToUpdate =  db.Ubicaciones.Attach(ubicacion);

                db.Entry(ubicacion).Collection(u => u.SearchKeys).Load();
                
                var selectkeys = from s in db.SearchKeys
                                 where ubicacion.SearchKeysID.Contains(s.SearchKeyID)
                                 select s;

                ubicacion.SearchKeys.Clear();
                
                foreach (SearchKey s in selectkeys)
                {
                    ubicacion.SearchKeys.Add(s);                    
                }                


                db.Entry(ubicacion).State = EntityState.Modified;
                db.SaveChanges();
                            
                return RedirectToAction("Index");
            }   
        
            ViewBag.LocalidadID = new SelectList(db.Localidades, "LocalidadID", "Nombre", ubicacion.LocalidadID);
            ViewBag.ProvinciaID = new SelectList(db.Provincias, "ProvinciaID", "Nombre", ubicacion.ProvinciaID);
            ViewBag.PaisID = new SelectList(db.Paises, "PaisID", "Nombre", ubicacion.PaisID);
            ViewBag.SearchKeysID = new MultiSelectList(db.SearchKeys, "SearchKeyID", "Valor", ubicacion.SearchKeysID);

            return View(ubicacion);
        }

        //
        // GET: /Ubicacion/Delete/5
        [Authorize(Roles = "admin,root")]
        public ActionResult Delete(int id)
        {
            ViewBag.Action = "Eliminar";
            this.SetTitle();
            Ubicacion ubicacion = db.Ubicaciones.Find(id);
            return View(ubicacion);
        }

        //
        // POST: /Ubicacion/Delete/5
        [Authorize(Roles = "admin,root")]
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            ViewBag.Action = "Eliminar";
            this.SetTitle();
            Ubicacion ubicacion = db.Ubicaciones.Find(id);
            db.Ubicaciones.Remove(ubicacion);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        public string GetProvinciasPorPais(int id)
        {
            var prov = from p in db.Provincias   
                       where p.PaisID == id   
                       select p;

            return new JavaScriptSerializer().Serialize(new SelectList(prov, "ProvinciaID", "Nombre"));
        }

        public string GetLocalidadesPorProvincia(int id)
        {
            var loc = from l in db.Localidades
                       where l.ProvinciaID == id
                       select l;

            return new JavaScriptSerializer().Serialize(new SelectList(loc, "LocalidadID", "Nombre"));
        }
    }
}